#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <string.h>

/*定义一个结构体*/
struct customer {
    char num[20];     //生日
    char name[10];    //姓名
    char sex[2];      //性别
    int age;         //年龄
} cu[100];

/*定义各函数*/
void menu();   //菜单
void save(int);  //保存
int load();  /*导入函数*/
void display();   //浏览
void del();       //删除
void add();      //添加
void search();   //查询
void search_num();  //按生日查
void search_name();  //按姓名查
void modify();     //修改
int statistics(int a, int b);//统计

int main_student() {

    setbuf(stdout,NULL);

    int n, r, age1, age2;
    char a;

    printf("请选择你需要操作的步骤(1--7):\n");

    menu();   //调用菜单函数

    scanf("%d", &n);
    while (n < 1 || n > 7) {
        printf("您输入有误，请重新选择!");
        scanf("%d", &n);

    }
    while (1) {
        switch (n) {
            case 1:
                printf("             ◆◆◆添加顾客信息◆◆◆\n");
                printf("\n");
                add();
                break;
            case 2:
                printf("             ◆◆◆浏览顾客信息◆◆◆\n");
                printf("\n");
                display();
                break;
            case 3:
                printf("                     ◆◆◆按生日查询顾客信息◆◆◆\n");
                printf("\n");
                search();
                break;
            case 4:
                printf("              ◆◆◆删除顾客信息◆◆◆\n");
                printf("\n");
                del();
                break;
            case 5:
                printf("               ◆◆◆修改顾客信息◆◆◆\n");
                printf("\n");
                modify();
                break;
            case 6:
                printf("               ◆◆◆统计顾客信息◆◆◆\n");
                printf("\n");
                printf("               请输入需要查询的年龄阶段\n");
                printf("\n");
                scanf("%d,%d", &age1, &age2);
                r = statistics(age1, age2);
                printf("人数为%d", r);
                break;
            case 7:
                exit(0);
                break;
            default :
                break;
        }
        getchar();
        printf("\n");
        printf("是否继续进行(y or n):\n");
        scanf("%c", &a);
        if (a == 'y') {
            system("cls");
            /*清屏*/
            menu();
            /*调用菜单函数*/
            printf("请再次选择你需要操作的步骤(1--7):\n");
            scanf("%d", &n);
            printf("\n");
        } else
            exit(0);
    }

}

void menu()   /*菜单函数*/
{
    printf("        ************欢迎进入顾客信息管理系统**********\n");
    printf("           1.添加顾客信息");
    printf("           2.浏览顾客信息\n");
    printf("           3.查询顾客信息");
    printf("           4.删除顾客信息\n");
    printf("           5.修改顾客信息\n");
    printf("           6.统计顾客信息\n");
    printf("           7.退出\n");
    printf("        ********************谢谢使用******************\n");
    printf("\n");
    printf("\n");
}

int statistics(int a, int b) //统计
{
    int i;
    int j = 0;
    for (i = 0; a < cu[i].age < b; i++)
        j++;
    return (j);
}

void save(int m)  /*保存文件函数*/
{
    int i;
    FILE *fp;
    fp = fopen("D:\\cu.txt", "wb");
    for (i = 0; i < m; i++) /*将内存中顾客的信息输出到磁盘文件中去*/
        if (fwrite(&cu[i], sizeof(struct customer), 1, fp) != 1)
            printf("file write error\n");
    fclose(fp);
}

int load()  /*导入+测长度函数*/
{
    FILE *fp;
    int i = 0;
    if ((fp = fopen("D:\\cu.txt", "rb")) == NULL)/*判断是否能打开*/
    {
        return 0;
    } else {
        do {
            fread(&cu[i], sizeof(struct customer), 1, fp);     //读文件到数组
            i++;             //顺便测量长度
        } while (feof(fp) == 0);   //判断文件是否读完
    }
    fclose(fp);   //关文件操作
    return (i - 1);   //返回文件长度
}

void display()  /*浏览函数*/
{
    int i;
    int m = load();
    for (i = 0; i < m; i++) {
        printf(" 生日                姓名          性别          年龄 \n");
        printf(" %-16s%-14s%-14s%d\n", cu[i].num, cu[i].name, cu[i].sex, cu[i].age);
        printf("\n");
        printf("\n");
    }
}

void add()/*添加函数*/
{
    FILE *fp;
    char string[10];
    int n; /*增加顾客的个数*/
    int i;
    int m = load();/*定义一个变量接受函数的返回值*/
    printf("请输入想增加的顾客人数:\n");
    scanf("%d", &n);
    getchar();
    for (i = m; i < (m + n); i++) /*从第m个数组开始，继续填充数组数据*/
    {

        printf("请输入生日:\n  ");
        //scanf("%s",&cu[i].num);
        gets(cu[i].num);

        printf("请输入姓名:\n  ");
        //scanf("%s",cu[i].name);
        gets(cu[i].name);
        printf("请输入性别: \n ");
        //scanf("%s",
        gets(cu[i].sex);
        printf("请输入年龄:\n  ");
        gets(string);
        cu[i].age = atoi(string);
        //scanf("%d",&);
        //printf("\n");
    }
    printf("\n添加完毕!\n");
    m = m + n; /*总顾客数*/
    save(m);/*将得到的顾客数返回到文本中*/
}

void del()   /*删除函数*/
{
    int m = load();
    int i, j, n, t, flag;
    char name[10];
    printf("\n 原来的顾客信息:\n");
    display();
    printf("\n");
    printf("请输入要删除的顾客的姓名:\n");
    scanf("%s", name);
    for (flag = 1, i = 0; flag && i < m; i++) {
        if (strcmp(cu[i].name, name) == 0) {
            printf("\n已找到此人，原始记录为：\n");
            printf(" 生日            姓名           性别     年龄 \n");
            printf(" %s               %s              %s        %d    \n", cu[i].num, cu[i].name, cu[i].sex, cu[i].age);
            printf("\n确实要删除此人信息请按1,不删除请按0\n");
            scanf("%d", &n);
            if (n == 1) {
                for (j = i; j < m - 1; j++)     //覆盖删除法
                {
                    strcpy(cu[j].num, cu[j + 1].num);  /*字符串复制*/
                    strcpy(cu[j].name, cu[j + 1].name);
                    strcpy(cu[j].sex, cu[j + 1].sex);
                    cu[j].age = cu[j + 1].age;
                }
                flag = 0;    //跳出循环
            }

        }
    }
    if (flag == 0) m = m - 1;
    else
        printf("\n对不起，查无此人!\n");
    save(m);     /*调用保存函数*/
    printf("\n继续删除请按1，不再删除请按0\n");
    scanf("%d", &t);
    switch (t) {
        case 1:
            del();
            break;
        case 0:
            break;
        default :
            break;
    }
}

void search()/*查询函数*/
{
    int t, flag;

    printf("\n1:按生日查询请按     2:按姓名查询请按 \n");
    scanf("%d", &t);
    while (t > 2 && t < 1)/*输入的t必须是1或者2*/
    {
        printf("输入出错，请从新输入:\n");
        scanf("%d", &t);
    }

    switch (t) {
        case 1:
            printf("按生日查询\n");
            search_num();
            break;
        case 2:
            printf("按姓名查询\n");
            search_name();
            break;
        default:
            break;
    }

}

void search_num()   //按生日查询函数
{
    char num[20];
    int i, t, k = 0;
    int m = load();/*把文本里面的所有数据读出*/
    printf("请输入要查找的生日:\n");
    scanf("%d", &num);
    for (i = 0; i < m; i++)
        if (strcmp(num, cu[i].num))/*比较输入的和文本里面的字符串*/
        {
            printf("\n已找到，其记录为：\n");
            printf(" 生日            姓名           性别     年龄 \n");
            printf(" %s               %s              %s        %d    \n", cu[i].num, cu[i].name, cu[i].sex, cu[i].age);
            k = 1;
        }
    if (k == 0)
        printf("\n对不起，查无此人\n");
    printf("\n");
    printf("继续查询请按1,结束查询请按2\n");
    scanf("%d", &t);
    switch (t) {
        case 1:
            search();
            break;
        case 2:
            break;

        default:
            break;
    }
}

void search_name()   //按姓名查询
{
    char name[10];
    int i, t, k = 0;
    int m = load();
    printf("请输入要查找的姓名:\n");
    scanf("%s", name);
    for (i = 0; i < m; i++)
        if (strcmp(cu[i].name, name) == 0) {
            printf("\n已找到，其记录为：\n");
            printf(" 生日            姓名           性别     年龄 \n");
            printf(" %s               %s              %s        %d    \n", cu[i].num, cu[i].name, cu[i].sex, cu[i].age);
            k = 1;
        }
    if (k == 0) /*记录顾客存不存在*/
        printf("\n对不起，查无此人\n");
    printf("\n");
    printf("继续查询请按1,结束查询请按2\n");
    scanf("%d", &t);
    switch (t) {
        case 1:
            search();
            break;
        case 2:
            break;

        default:
            break;
    }
}

void modify() /*修改函数*/
{
    char num[20];
    char name[10];
    char sex[2];
    int age;
    int c, i, t, flag;
    int m = load();
    printf("\n 原来的顾客信息:\n");
    display();
    printf("\n");
    printf("请输入要修改的顾客的姓名:\n");
    scanf("%s", name);
    for (flag = 1, i = 0; flag && i < m; i++) {
        if (strcmp(cu[i].name, name) == 0) {
            printf("\n已找到此人，原始记录为：\n");

            printf(" 生日            姓名           性别     年龄 \n");
            printf(" %s               %s              %s        %d    \n", cu[i].num, cu[i].name, cu[i].sex, cu[i].age);
            printf("请输入你想修改的那一项序号:\n");
            scanf("%d", &c);
            while (c > 4 || c < 1) {
                printf("\n选择错误，请重新选择!\n");
                scanf("%d", &c);
            }

            flag = 0;
        }
    }
    if (flag == 1)
        printf("\n对不起，查无此人!\n");
    if (flag == 0) {
        switch (c)      /*因为当找到第i个职工时,for语句后i自加了1,所以下面的应该把改后的信息赋值给第i-1个人*/
        {
            case 1:
                printf("生日改为: ");
                scanf("%s", num);
                strcpy(cu[i - 1].num, num);
                break;
            case 2:
                printf("姓名改为: ");
                scanf("%s", name);
                strcpy(cu[i - 1].name, name);
                break;
            case 3:
                printf("性别改为: ");
                scanf("%s", sex);
                strcpy(cu[i - 1].sex, sex);
                break;
            case 4:
                printf("年龄改为: ");
                scanf("%d", age);
                cu[i - 1].age = age;
                break;
        }
        printf("修改成功\n");
    }
    save(m);
    printf("\n继续修改请按1，不再修改请按2\n");
    scanf("%d", &t);
    switch (t) {
        case 1:
            modify();
            break;
        case 2:
            break;
        default :
            break;
    }
}

